const express = require('express')
const router = express.Router()
const moment = require('moment')

// 导入模型对象
const { New,Cate}=require('../models')
const {Op} = require("sequelize")

// 实例化模型对象
const newsModel=new New()
const cateModel = new Cate()

// 导入验证表单数据的中间件
const expressJoi = require('@escook/express-joi')

const {
    news_list_schema
}=require('../schema/news')

// 1.新闻列表
// 1.1 展示新闻页面
router.get('/news',async (req, res)=>{
   // 查询新闻分类数据
   const cates = await cateModel.getCateList()
   res.render('news/index.html',{cates})
})

// 1.2.查询分页数据
router.get('/newsApi', expressJoi(news_list_schema),async (req, res) => {
     // 接收分页数据
     const page=req.query.page || 1
     const limit=parseInt(req.query.limit || 3)
     // 接收搜索条件
     const cate_id=parseInt(req.query.cate_id || 0)
     const title=req.query.title || ''

     // 定义空对象保存搜索条件,并组装搜索条件
     var searchWhere={
         data_flag:1
     }
     if(cate_id){
         searchWhere.cateId=cate_id
     }
     if(title){
         searchWhere.title={
             [Op.substring]: title,
         }
     }
     console.log(searchWhere);

     // 调用模型方法
     const offset = (page - 1) * limit
     const data = await New.findAndCountAll({
         attributes: ['id', 'title', 'img_url', 'author', 'view_nums', 'add_time', 'cateId'],
         where: searchWhere,
         order: [
             ['add_time', 'desc']
         ],
         offset,
         limit,
         include: [{
             model: Cate,
             attributes: ['cate_name']
         }]
     })

   /*   for(let i=0;i<data.rows.length;i++) {
         // 增加cate_name属性
         //data.rows[i].dataValues.cate_name = data.rows[i].dataValues.Cate.cate_name
         // 时间格式化
          //data.rows[i].dataValues.add_time = moment(data.rows[i].dataValues.add_time).format('YYYY-MM-DD HH::mm:ss')  
     }  */
     return res.json({
         code:0,
         msg:'ok',
         count:data.count,
         data:data.rows
     })
})

// 2.新闻添加

// 2.1 展示新闻添加表单
router.get('/news/add',async (req,res)=>{
    // 获取新闻分类数据
    const cates = await cateModel.getCateList()
    res.render('news/add.html',{
        cates
    })
})

// 2.2 图片上传的接口
// 导入解析 formdata 格式表单数据的包
const multer = require('multer')
// 导入处理路径的核心模块
const path = require('path')
const fs = require('fs')

// 创建 multer 的实例对象，通过 dest 属性指定文件的存放路径
//创建目录
var upload_dir = path.join(__dirname, '../public/uploads/');
// 先判断uploads目录是否存在，如果不存在就创建
/* if (!fs.existsSync(upload_dir)) {
    // 创建目录
    fs.mkdirSync(upload_dir)
} */
const upload = multer({
    dest: upload_dir
})
// upload.single() 是一个局部生效的中间件，用来解析 FormData 格式的表单数据
// 将文件类型的数据，解析并挂载到 req.file 属性中

router.post('/news/upload', upload.single('file'),(req, res) => {
    
    //  获取上传好的文件数据对象
    const fileData = req.file
     // 获取上传的文件后缀名
    const ext = fileData.mimetype.split('/')[1]
    // 获取文件上传的名字
    const filename = fileData.filename+'.'+ext

    // 方案一：把图片保存在服务器，服务器返回图片的地址
    // 读取文件的内容并且写入到文件中
     // 读取文件内容
     let img_str = fs.readFileSync(fileData.path)
 
     // 写文件
    fs.writeFileSync(path.join(fileData.destination,filename), img_str)
    // 删除原始文件
    fs.unlinkSync(fileData.path)
    // 最终返回的文件名必须是带有绝对路径的文件名，否则，无法被外部访问
    return res.cc(200,'上传成功','/uploads/'+filename)
    // 方案二：可以把图片上传到OSS云存储中，云存储中返回图片地址:带有域名的可访问的地址（推荐）

    // 方案三：返回图片的base64格式的字符串
   /*  const data = fs.readFileSync(fileData.path)
    const str = Buffer.from(data).toString('base64')
    const img_str='data: image/' + ext + ';base64,'+str
    // 删除原始文件
    fs.unlinkSync(fileData.path)
    return res.cc(200,'ok',img_str) */
})

// 2.3 新闻添加入库
router.post('/news/add',async (req,res)=>{
     try{
           // 接收表单数据
           const data = req.body
           data.add_time = new Date()
           await newsModel.addNews(data)
           res.cc(200, '添加成功')
     }catch(e){
         throw new Error(e.message)
     }
   
})



module.exports =router